package oldcode;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.to8to.kitt.esb.BusMessageState;


public class BusStatusManager {
	
	public static Logger logger = LoggerFactory.getLogger(BusStatusManager.class);  
	
//	private int scanIntervalMs = 60000;
	
//	private int msgTimeoutMs = 3600000;
	
	public Map<String, BusMessageState> statusMap = new HashMap<String, BusMessageState>();
	
//	private Map<String, ServiceStat> statMap = new HashMap<String, ServiceStat>();
	
//	private Cache<String, BusMsgStatus<T>> statusMap = CacheBuilder.newBuilder()
//			.expireAfterWrite(Constants.ESB_EXP_TIME_SEC, TimeUnit.SECONDS)
//            .build();
	
	
//	Gson gson = new Gson();
	
	public Map<String, BusMessageState> getStatusMap() {
		return statusMap;
	}


	public void cleanOnce()
	{
//		long now = System.currentTimeMillis();
//		
//		Set<String> removeSeq = new HashSet<String>();
//		
//		for(String key: statusMap.keySet())
//		{
//			BusMsgStatus<T> status = statusMap.get(key);
//			if(status == null)
//			{
//				removeSeq.add(key);
//				continue;
//			}
//			
//			if(now - status.getRecvFromClientTime() > msgTimeoutMs) //timeout
//				removeSeq.add(key);
//		}
//		
//		for(String key: removeSeq)
//		{
//			BusMsgStatus<T> status = statusMap.get(key);
//			if(status != null)
//			{
//				logger.trace("清理超时的任务: " + status.getName() + ", 收到请求时间: " + DateUtil.format(new Date(status.getRecvFromClientTime())));
//				status.release();
//				statusMap.remove(key);
//			}
//		}
	}
	
//	public ServiceStat getTotalStat()
//	{
//		ServiceStat all = new ServiceStat();
//		
//		all.key = "*:*";
//		
//		all.first_time = Long.MAX_VALUE;
//		
//		for(String key : statMap.keySet())
//		{
//			ServiceStat stat = statMap.get(key);
//			
//			all.succ += stat.succ;
//			all.total += stat.total;
//			all.succ_time += stat.succ_time;
//			all.first_time = Math.min(all.first_time, stat.first_time);
//		}
//		
//		return all;
//	}
//	
//	public BusMsgStatus<T> getStatus(String msgKey)
//	{
//		BusMsgStatus<T> status = statusMap.get(msgKey);
//		if(status != null)
//			return status;
//		
//		for(int t = 0 ; t < 3; ++ t)
//		{
//			logger.warn("下游回复的消息序列号:{} 找不到，重试 第{}次 seq2status.get(msgKey): 。。。", msgKey, t + 1);
//			status = statusMap.get(msgKey);
//			if(status != null)
//			{
//				logger.warn("seq2status.get(msgKey) 。。。 找到啦！", msgKey);
//				return status;
//			}
//		}
//		return null;
//	}
	
//	public void openStat(String key)
//	{
//		ServiceStat stat = statMap.get(key);
//		if(stat == null)
//		{
//			stat = new ServiceStat();
//			stat.first_time = System.currentTimeMillis();
//			stat.key = key;	
//			statMap.put(key, stat);
//		}
//		stat.total ++;
//	}
//	
//	public void finishStat(String key, boolean succ, long time)
//	{
//		ServiceStat stat = statMap.get(key);
//		if(stat != null)
//		{
//			if(succ)
//			{
//				stat.succ_time += time;
//				stat.succ ++;
//			}
//			else 
//				stat.fail ++;
//		}
//	}
	
//	public void process(ServiceStat stat)
//	{
//		stat.avg_succ_time = (long)((double)stat.succ_time/(double)stat.succ);
//		stat.time_span = System.currentTimeMillis() - stat.first_time;
//	}
//	
//	public String formatServiceStat(ServiceStat stat)
//	{
//		double ts_pq = (double)stat.succ_time/(double)stat.succ;
//		double delta = (double)(System.currentTimeMillis() - stat.first_time);
//		double qps = delta > 0 ? stat.total*1000/delta : 0;
//		return "key:" + stat.key + ", "
//				+ "total:" + stat.total + ", "
//				+ "succ:" + stat.succ + ", "
//				+ "fail:" + stat.fail + ", "
//				+ "pending:" + (stat.total-stat.succ-stat.fail) + ", "
//				+ "aqt:" + (float)ts_pq + " ms, "
//				+ "qps:" + (float)qps;
//	}
//
//	public void handleStatQuery(ChannelHandlerContext ctx, Object msg)
//    {
//		ThriftMessage req = null;
//		
//		if(msg instanceof BusMessage)
//			req = ThriftMessageCodec.decode(((BusMessage)msg).getBuff());
//		else if (msg instanceof ThriftMessage)
//			req = (ThriftMessage)msg;
//		
//		TMessage head = req.getHead();
//		TMessageMeta meta =  null;
//		
//		if(head != null)
//			meta = head.getTMessageMeta();
//			
//    	
//    	String serviceMethod = meta.serviceMethod();
//    	
//    	ThriftMessage res = ThriftMessage.newReplyMessage(req.getHead());;
//    	
//    	if(BusStatusService.getStat_name.equals(serviceMethod))
//    	{
//    		BusStatusService.getStat_args args = (BusStatusService.getStat_args)req.getBody();
//    		
//    		String service = args.getServiceid();
//    		
//    		String method = args.getMethod();
//    		
//    		BusStatusService.getStat_result result = new BusStatusService.getStat_result();
//    		
//    		ServiceStat all = new ServiceStat();
//    		
//    		all.key = "*:*";
//    		
//    		all.first_time = System.currentTimeMillis();
//    		
//    		result.addToSuccess(all);
//    		
//    		for(ServiceStat stat : statMap.values())
//    		{
//    			if( (StringUtils.isEmpty(service) || stat.key.startsWith(service))
//    					&&  (StringUtils.isEmpty(method) || stat.key.endsWith(method))
//    					)
//    			{
//    				process(stat);
//    				result.addToSuccess(stat);
//    				all.fail += stat.fail;
//    				all.succ += stat.succ;
//    				all.total += stat.total;
//    				all.succ_time += stat.succ_time;
//    				all.first_time = Math.min(all.first_time, stat.first_time);
//    			}
//    		}
//    		
//    		process(all);
//    		
//    		res.setBody(result);
//    		res.setMeta(meta);
//    	}
//    	
//    	Object outmsg = res;
//    	
//    	if(msg instanceof BusMessage)
//    	{
//    		ByteBuf buf = ThriftMessageCodec.encode(res);
//    		BusMessage bmsg = new BusMessage();
//			bmsg.setHead(res.getHead());
//			bmsg.setBuff(buf);
//			bmsg.setMeta(meta);
//			outmsg = bmsg;
//			ctx.writeAndFlush(outmsg);
//    	}
//    	else 
//    	{
//    		String txt = gson.toJson(res.getBody());
//    		Http2ThriftHandler.sendResponse(ctx, OK, txt, null);
//    	}
//    }
}
